package loan.calc.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 金额操作类
 *
 * @date 2020/10/14
 */
public class BigDecimalUtils {

    public static final ThreadLocal<DecimalFormat> DECIMAL_FORMAT_THREAD_LOCAL = ThreadLocal.withInitial(() -> {
        /*
        数字格式有哪些？
            # 代表任意数字
            , 代表千分位
            . 代表小数点
            0 代表不够时补0

            ###,###.##
                表示：加入千分位，保留2个小数。
         */
        return new DecimalFormat("#,##0.00");
    });

    public static final RoundingMode DEFAULT_CURRENCY_ROUNDING_MODE = RoundingMode.HALF_UP;

    /**
     * 金额（保留两位小数）
     */
    public static final int CURRENCY_SCALE = 2;

    /**
     * 利率（保留八位小数）
     */
    public static final int RATE_SCALE = 8;

    /**
     * 计算过程中的金额（保留十位小数）
     */
    public static final int CALCULATING_CURRENCY_SCALE = 10;

    public static BigDecimal roundCurrency(BigDecimal currency) {
        return currency.setScale(CURRENCY_SCALE, DEFAULT_CURRENCY_ROUNDING_MODE);
    }
    public static BigDecimal roundCalculatingCurrency(BigDecimal currency) {
        return currency.setScale(CALCULATING_CURRENCY_SCALE, DEFAULT_CURRENCY_ROUNDING_MODE);
    }
    public static BigDecimal roundRate(BigDecimal rate) {
        return rate.setScale(RATE_SCALE, DEFAULT_CURRENCY_ROUNDING_MODE);
    }

    public static String currencyFormat(BigDecimal val) {
        /*
        数字格式有哪些？
            # 代表任意数字
            , 代表千分位
            . 代表小数点
            0 代表不够时补0

            ###,###.##
                表示：加入千分位，保留2个小数。
         */
        try {
            return DECIMAL_FORMAT_THREAD_LOCAL.get().format(val);
        } finally {
            DECIMAL_FORMAT_THREAD_LOCAL.remove();
        }
    }
}
